﻿/*!
L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript.
Created By NanaLich. 2010-09-10
This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it.
*/

!function () {

  function attachEntry(o, a, m) {
    var i, j, n;
    o = [].concat(o);
    //if (!(o instanceof Array)) o = [o];

    while (i = o.shift()) {
      for (j in a) {
        if (!i[n = a[j]]) i[n] = m;
      }
    }
  }

  var xx = /"(?:\\[\s\S]|[^\x22])*"|'(?:\\[\s\S]|[^\x27])*'|([^\s\w]\s*)\[(\s*|\s*[A-Z_$][\w$]*\s*(?:,\s*[A-Z_$][\w$]*\s*)*)\]\s*(>)\s*(\(?)/gi;
  var xy = /[\n\r),;\]}]|$/.source;

  function rxClone(rx) {
    return new RegExp(rx.source, (rx.global ? 'g' : '') + (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : ''));
  }
  attachEntry(RegExp, ['clone'], rxClone);
  attachEntry(RegExp.prototype, ['clone'], function () {
    return rxClone(this);
  });


  function translateLambda(s) {
    if (typeof (s) != 'string') s = '' + s;

    var x = xx.clone(); // 由于firefox、safari等浏览器对全局匹配正则表达式有过度的优化，所以这里采用一种迂回的办法创建不重复的正则表达式实例
    var m, l = 0, r = '';

    while (m = x.exec(s)) {
      var h = m[0];

      switch (h.charAt(0)) { // 判断期待的语法成分
        case '$': // 函数传参
        case ')':
        case ']':
        case '"': // 匹配到了字符串
        case "'":
          continue; // 以上皆跳过
      }

      var p, q, t, k = m[4].length, y = new RegExp(k ? '\\)' : xy, 'g');

      r += s.substring(l, p = m.index); // 在结果字符串上附加之前余留的内容
      y.lastIndex = l = p + h.length; // 从伪运算符之后开始寻找右括号或者其它符号

      while (q = y.exec(s)) {
        q = q.index;
        try {
          t = 'return(' + s.substring(l, q) + ');';
          new Function(t); // 语法测试

          r += m[1] + 'function(' + m[2] + '){ ' + translateLambda(t) + ' }'; // 翻译里面的内容

          x.lastIndex = l = q + k; // 下一次查找从当前边界之后开始

          break;
        } catch (ex) { }
      }
      if (!q) l = p; // 说明找不到右括号或者有效的代码，直接附加所有匹配的内容

    }

    try {
      r += s.substr(l);

      if (/[\w$]*|"(\\[\s\S]|[^\x22])*"|'(\\[\s\S]|[^\x27])*'/.exec(r)[0] == 'function')  // 粗略判断产生的是不是函数（可以应付绝大部分情况）
        r = '0,' + r; // 使用这种“怪”形式可以在所有浏览器（包括IE）中得到预期的效果

      new Function(r); // 语法测试
      return r;
    } catch (ex) { // 失败，返回原文
      return s;
    }

  };


  var lamdaAliases = ["translateLambda", "lambda", "lamda"];

  attachEntry([Function, String], lamdaAliases, translateLambda);
  attachEntry([Function.prototype, String.prototype], lamdaAliases, function () {
    return translateLambda(this);
  });
  attachEntry([Function.prototype, String.prototype], ['lambdaExec', 'lamdaExec'], function () {
    return new Function(translateLambda(this))();
  });
} ();